package com.guangfeng.yql.comm.util;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.guangfeng.yql.comm.annocation.Matching;
import com.guangfeng.yql.comm.enumerate.MatchingType;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;

@Slf4j
public class WrapperUtil {

    @SneakyThrows
    public static <T> Wrapper<T> getWrapper(T data) {
        if (data == null) {
            return new QueryWrapper<>();
        }
        Field[] fields = data.getClass().getDeclaredFields();
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        for (Field field : fields) {
            if (field.getName().equalsIgnoreCase("serialVersionUID")) {
                continue;
            }
            field.setAccessible(true);
            Object o = field.get(data);
            if (o == null) {
                continue;
            }
            setMatching(wrapper, field, o);
        }
        return wrapper;
    }

    private static <T> void setMatching(QueryWrapper<T> wrapper, Field field, Object data) {
        Matching matching = field.getAnnotation(Matching.class);
        String column = getColumn(field);
        if (matching == null) {
            log.info("column : {} , data : {}", column, data);
            wrapper.eq(column, data);
        } else {
            setMatchingByMatchingType(wrapper, matching.value(), column, data);
        }
    }

    /**
     * 获取字段对应的 column 名称 根据@TableId 和 TableField 否则返回该字段名称
     *
     * @param field 字段
     * @return column 名称
     */
    private static String getColumn(Field field) {
        TableId tableId = field.getAnnotation(TableId.class);
        if (tableId != null) {
            return tableId.value();
        }
        TableField tableField = field.getAnnotation(TableField.class);
        if (tableField != null) {
            return tableField.value();
        }
        return field.getName();
    }

    /**
     * 设置 wrapper 的当前字段的查询类型
     *
     * @param wrapper wrapper
     * @param type    类型
     * @param column  字段名称
     * @param data    数据
     * @param <T>     泛型
     */
    private static <T> void setMatchingByMatchingType(QueryWrapper<T> wrapper, MatchingType type, String column, Object data) {
        switch (type) {
            case EQ:
                wrapper.eq(column, data);
                return;
            case GT:
                wrapper.gt(column, data);
                return;
            case LT:
                wrapper.lt(column, data);
                return;
            case LIKE:
                wrapper.like(column, data);
                return;
            default:
                wrapper.eq(column, data);
        }
    }


}
